package com.exercises;

import java.util.Arrays;

//冒泡排序就是“两两比较，大的往后放”，直到整个数组有序
public class BubbleSort {
    public static void main(String[] args) throws Exception {
        com.arithmetic.BubbleSort bubbleSort = new com.arithmetic.BubbleSort();
        int arr[] = {1, 2, 3, 412, 222, 52, 908, 92, 1, 42};
        int[] sort = bubbleSort.sort(arr);
        System.out.println(sort.length);
    }

//    冒泡排序是一种简单的排序算法，它的核心思想是：
//    重复遍历数组：从头开始比较相邻的两个元素。
//    交换位置：如果前一个元素比后一个元素大，就交换它们的位置。
//    每轮遍历后：最大的元素会像“气泡”一样慢慢浮到数组的末尾。
//    优化机制：如果某次遍历中没有发生任何交换，说明数组已经有序，可以提前结束排序。
//
//    以你选中的代码为例，具体流程如下：
//    int[] arrs = Arrays.copyOf(...)：先复制原数组，避免修改原始数据。
//    外层循环 for (int i = 1; i < arrs.length; i++)：控制总共要遍历多少轮。
//    内层循环 for (int j = 0; j < arrs.length - i; j++)：每轮遍历比较相邻元素，并交换位置。
//            if (arrs[j] > arrs[j + 1])：如果前一个数比后一个数大，就交换。
//    flag 的作用是优化排序过程：如果一轮中没有发生交换，说明已经有序，直接 break 结束排序。
//    最终返回排好序的数组 arrs。
//
//    举个例子： 原始数组：[5, 3, 1, 4]
//    第一轮比较后：[3, 1, 4, 5]（5 被“冒泡”到末尾） 第二轮比较后：[1, 3, 4, 5]（3 被放到正确位置） 第三轮比较时发现没有交换，排序结束。
    public int[] sort(int[] sourceArray) {
        int[] arrs = Arrays.copyOf(sourceArray, sourceArray.length);
        for (int i = 1; i < arrs.length; i++) {
            // 设定一个标记，若为true，则表示此次循环没有进行交换，也就是待排序列已经有序，排序已经完成。
            boolean flag = true;
            for (int j = 0; j < arrs.length - i; j++) {
                if (arrs[j] > arrs[j + 1]) {
                    int temp = arrs[j];
                    arrs[j] = arrs[j + 1];
                    arrs[j + 1] = temp;
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
        return arrs;
    }
}
